package br.fafica.poo2.rightcode.filtro;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.fafica.poo2.rightcode.Aplicacao;
import br.fafica.poo2.rightcode.aluno.Aluno;
import br.fafica.poo2.rightcode.exception.AlunoNaoEncontradoException;
import br.fafica.poo2.rightcode.exception.FiltroNaoEncontradoException;
import br.fafica.poo2.rightcode.exception.listaAlunoVaziaException;
import br.fafica.poo2.rightcode.exception.listaFiltroVaziaException;
import br.fafica.poo2.rightcode.factory.ConnectionFactoryOracle;

public class RepositorioFiltroOracle implements IRepositorioFiltro {
	
	private ConnectionFactoryOracle con;
	private Statement entrada;
	private static int increment;
	
	public RepositorioFiltroOracle(ConnectionFactoryOracle oracle) throws SQLException{
		this.con = oracle;
		increment = (getCodigoIncrement()+1);
	}
	
	private int getCodigoIncrement() throws SQLException{
		ArrayList<Filtro> lista = null;
		Connection con=null;
		ResultSet resultado = null;
		Filtro f;

		try {
			String sql1="select * from filtro";
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery(sql1);
			con.commit();
			con.setAutoCommit(true);
			lista= new ArrayList<Filtro>();
		    while ( resultado.next() ) {
		    	f = new Filtro(resultado.getInt("codigo_filtro"),resultado.getString("nome_filtro"),resultado.getString("descricao"),resultado.getString("conteudo"),resultado.getInt("codigo_usuario"));
		    	
		    	lista.add(f);
		    }
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		
		return lista.size();
		
	}

	@Override
	public void TesteFiltro()throws SQLException{
		Connection con=null;
		con=this.con.getConexao();
		System.out.println("Conexão aberta. Testes temporários");
		con.close();
	}

	@Override
	public void InstalarFiltro(boolean samples) throws SQLException{
		Connection con = null;

		try {
		    String sql1 = "create table filtro" +
	                   "(codigo_filtro number(5) primary key ," +
	                   "nome_filtro varchar2(100) not null,"
	                   + "conteudo varchar2(1000) not null,"
	                   + "descricao varchar2(100) not null,"
	                   + "codigo_usuario number(5),"
	                   + "foreign key(codigo_usuario) references usuario(codigo_usuario) on delete cascade)";
		   
			con = this.con.getConexao();
			entrada = con.createStatement();
		    entrada.execute(sql1);
		    con.commit();
			con.setAutoCommit(true);
		    
		}catch(Exception e){
			con.rollback();	
		}finally{
		    entrada.close();
			con.close();
		}
		
		if(samples){
			Aplicacao app = new Aplicacao();
			for(Filtro f: app.getFiltro()){
				AdicionarFiltro(f);
			}
		}
		
		
	}

	@Override
	public void AdicionarFiltro(Filtro filtro)throws SQLException{
		Connection con = null;
		
		if(filtro.getCodigo()==0){
			filtro.setCodigo(increment);
			increment+=1;
		}

		try {
			con = this.con.getConexao();
		    String sql = "insert into filtro (codigo_filtro, nome_filtro, conteudo, descricao, codigo_usuario) values (" +
		                   filtro.getCodigo() + ", " +
		                   "'" + filtro.getNome()+"', '" + filtro.getConteudo()+ "','"+ filtro.getDescricao()+"'," + filtro.getCodigo_usuario() + ")"; 
			entrada = con.createStatement();
			entrada.executeUpdate(sql);
			System.out.println("Filtro inserido na tabela"); // linha Temporaria
		}catch(Exception e){
			con.rollback();	
		}finally {
			entrada.close();
			con.close();
		}
		
	}

	@Override
	public ArrayList<Filtro> ListaFiltro() throws SQLException, listaFiltroVaziaException {
		
		ArrayList<Filtro> lista = null;
		Connection con=null;
		ResultSet resultado = null;
		Filtro f;

		try {
			String sql1="select * from filtro";
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery(sql1);
			con.commit();
			con.setAutoCommit(true);
			lista= new ArrayList<Filtro>();
		    while ( resultado.next() ) {
		    	f = new Filtro(resultado.getInt("codigo_filtro"),resultado.getString("nome_filtro"),resultado.getString("descricao"),resultado.getString("conteudo"),resultado.getInt("codigo_usuario"));
		    	
		    	lista.add(f);
		    }
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		if(lista.isEmpty()){
			throw new listaFiltroVaziaException();
		}else{
			return lista; //Criar uma exception Lista Vazia
		}
	}

	@Override
	public void RemoverFiltro(Filtro filtro)throws SQLException{
		Connection con=null;

		try {
			con = this.con.getConexao();
		    String sql = "delete from filtro where codigo_filtro=" +
		                   filtro.getCodigo();
		   	entrada = con.createStatement();
			entrada.executeUpdate(sql);
			con.commit();
			con.setAutoCommit(true);
		}catch(Exception e){
			con.rollback();	
		}finally{
			entrada.close();
			con.close();
		}
	}
		
	@Override
	public Filtro BuscarFiltro(int codigo)throws SQLException,FiltroNaoEncontradoException {
		Connection con=null;
		ResultSet resultado = null;
		Filtro f=null;
		con.setAutoCommit(false);
		try {
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery( "select * from filtro where codigo_filtro=" + codigo);
			con.commit();
			con.setAutoCommit(true);
			//LEMBRETE. Organizar para retornar as disciplinas tambem
		    while ( resultado.next() ) {
		    	f = new Filtro(resultado.getInt("codigo_filtro"),resultado.getString("nome_filtro"),resultado.getString("conteudo_filtro"),resultado.getString("descricao_filtro"),resultado.getInt("codigo_usuario"));
		    	
		    }
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		if(f==null){
			throw new FiltroNaoEncontradoException();
		}else{
			return f;
		}
	}

	@Override
	public void EditarFiltro(Filtro filtro) throws SQLException, FiltroNaoEncontradoException {
		Connection con=null;
		con.setAutoCommit(false);
		try {
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();

		    String sql = "update filtro SET " +
		    				"nome_filtro='" + filtro.getNome() + "'," +
		    				"conteudo_filtro='"+ filtro.getConteudo() +"',"+
		    				"descricao_filtro='"+ filtro.getDescricao()+"',"+
		    				"codigo_usuario='"+filtro.getCodigo_usuario()+"'"+
		    				"WHERE codigo_filtro=" + filtro.getCodigo(); 
			entrada.executeUpdate(sql);
			con.commit();
			con.setAutoCommit(true);
		    
		}catch(Exception e){
			con.rollback();	
		}finally{
			entrada.close();
			con.close();
		}
	}
		
	}

	

